/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.general.bc;

import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;
import org.cip.esymons.general.be.PersonaNatural;
import org.cip.esymons.general.be.TelefonoSolicitante;
import org.cip.esymons.general.be.UsuarioWeb;

/**
 *
 * @author Lizardo
 */
@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class UsuarioWebFacade implements UsuarioWebFacadeLocal {
    @Resource UserTransaction tx;
    @PersistenceContext(unitName="org.cip.esymons-ejbPU")
    private EntityManager em;

    public String crearUsuario(PersonaNatural persona,
                               TelefonoSolicitante telefono,
                               UsuarioWeb usuarioWeb) {
        String msg = null;
        try {
            tx.begin();
            em.persist(persona);
            telefono.setSolCodigo(persona);
            em.persist(telefono);
            usuarioWeb.setPerCodigo(persona);
            em.persist(usuarioWeb);
            tx.commit();
            msg = "Usuario registrado correctamente!";
        } catch (Exception e) {
            try {
                tx.rollback();
                msg = e.getMessage();
                System.out.println(e.getMessage());
            } catch (IllegalStateException ex) {
                Logger.getLogger(UsuarioWebFacade.class.getName()).log(Level.SEVERE, null, ex);
            } catch (SecurityException ex) {
                Logger.getLogger(UsuarioWebFacade.class.getName()).log(Level.SEVERE, null, ex);
            } catch (SystemException ex) {
                Logger.getLogger(UsuarioWebFacade.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return msg;
    }

    public String modificarUsuario(PersonaNatural persona,
                                   TelefonoSolicitante telefono,
                                   UsuarioWeb usuarioWeb) {
        String msg = null;
        try {
            tx.begin();
            em.merge(persona);
            telefono.setSolCodigo(persona);
            em.merge(telefono);
            usuarioWeb.setPerCodigo(persona);
            em.merge(usuarioWeb);
            tx.commit();
            msg = "Usuario actualizado correctamente!";
        } catch (Exception e) {
            try {
                tx.rollback();
                msg = e.getMessage();
                System.out.println(e.getMessage());
            } catch (IllegalStateException ex) {
                Logger.getLogger(UsuarioWebFacade.class.getName()).log(Level.SEVERE, null, ex);
            } catch (SecurityException ex) {
                Logger.getLogger(UsuarioWebFacade.class.getName()).log(Level.SEVERE, null, ex);
            } catch (SystemException ex) {
                Logger.getLogger(UsuarioWebFacade.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return msg;
    }

    public void eliminarUsuario(PersonaNatural persona,
                                TelefonoSolicitante telefono,
                                UsuarioWeb usuarioWeb) {
        try {
            tx.begin();
            em.remove(persona);
            telefono.setSolCodigo(persona);
            em.remove(telefono);
            usuarioWeb.setPerCodigo(persona);
            em.remove(usuarioWeb);
            tx.commit(); 
        } catch (Exception e) {
            System.out.println(e.getMessage());
            try {
                tx.rollback();
            } catch (IllegalStateException ex) {
                Logger.getLogger(UsuarioWebFacade.class.getName()).log(Level.SEVERE, null, ex);
            } catch (SecurityException ex) {
                Logger.getLogger(UsuarioWebFacade.class.getName()).log(Level.SEVERE, null, ex);
            } catch (SystemException ex) {
                Logger.getLogger(UsuarioWebFacade.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }



    public void create(UsuarioWeb usuarioWeb) {
        em.persist(usuarioWeb);
    }

    public void edit(UsuarioWeb usuarioWeb) {
        try {
            tx.begin();
            em.merge(usuarioWeb);
            tx.commit();
        } catch (Exception e) {
            System.out.println("FATAL: " + e.getMessage());
            try {
                tx.rollback();
            } catch (IllegalStateException ex) {
                Logger.getLogger(UsuarioWebFacade.class.getName()).log(Level.SEVERE, null, ex);
            } catch (SecurityException ex) {
                Logger.getLogger(UsuarioWebFacade.class.getName()).log(Level.SEVERE, null, ex);
            } catch (SystemException ex) {
                Logger.getLogger(UsuarioWebFacade.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void remove(UsuarioWeb usuarioWeb) {
        em.remove(em.merge(usuarioWeb));
    }

    public UsuarioWeb find(Object id) {
        return em.find(UsuarioWeb.class, id);
    }

    public List<UsuarioWeb> findAll() {
        return em.createQuery("select u from UsuarioWeb u").getResultList();
    }

    public List<UsuarioWebAdapter> listarUsuarios() {
        try {
            return em.createQuery("select new org.cip.esymons.general.bc.UsuarioWebAdapter(p.perapellidoPaterno,p.perapellidoMaterno,p.perNombres,p.perNroDNI,u.uweCuenta) from UsuarioWeb u join u.perCodigo p where u.uweActivo = true order by p.perapellidoPaterno,p.perapellidoMaterno,p.perNombres")
                    .getResultList();
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return null;
        }
    }

    public UsuarioWeb logueo(String cuenta, String clave) {
        try {
            return (UsuarioWeb)em.createQuery("select u from UsuarioWeb u join u.perCodigo p where u.uweCuenta = ?1 and u.uweClave = ?2 and u.uweActivo = true")
                                .setParameter(1, cuenta)
                                .setParameter(2, clave).getSingleResult();
        } catch (Exception ex) {
            System.out.println("ERROR FACADE: " + ex.getMessage());
            return null;
        }
    }

    public UsuarioWeb buscarUsuario(String cuenta) {
        try {
            return (UsuarioWeb)em.createQuery("select distinct u from UsuarioWeb u where u.uweCuenta = ?1")
                                .setParameter(1, cuenta)
                                .getSingleResult();

        } catch (Exception ex) {
            System.out.println("ERROR FACADE: " + ex.getMessage());
            return null;
        }
    }

    public UsuarioWeb recuperarClave(Integer id) {
        try {
            return (UsuarioWeb)em.createQuery("select u from UsuarioWeb u where u.uweId = ?1")
                                .setParameter(1, id)
                                .getSingleResult();
        } catch (Exception ex) {
            System.out.println("ERROR FACADE: " + ex.getMessage());
            return null;
        }
    }

    public UsuarioWeb mostrarClave(Integer id, String respuesta) {
        try {
            return (UsuarioWeb)em.createQuery("select u from UsuarioWeb u where u.uweId = ?1 and u.uwerSecreta = ?2")
                                .setParameter(1, id)
                                .setParameter(2, respuesta)
                                .getSingleResult();
        } catch (Exception ex) {
            System.out.println("ERROR FACADE: " + ex.getMessage());
            return null;
        }
    }

}
